package org.xlp.expression;

import org.xlp.assertion.AssertUtils;

/**
 * Description: 表达式解析工厂
 * <br/>date: 2024/12/30 17:05
 *
 * @version 1.0
 * @author: xlp
 */
public class ExpressionParserFactory {
    /**
     * 获取数学表达式的解析器
     * @param itemParser
     * @return 返回解析器
     * @throws NullPointerException 假如参数为null，则抛出该异常
     */
    public static IExpressionParser getExpressionParser(IExpressionItemParser itemParser){
        AssertUtils.isNotNull(itemParser, "itemParser parameter must be not null!");
        itemParser.parse();
        ExpressionComplexity complexity = itemParser.getExpressionComplexity();
        switch (complexity){
            case INT_A_S:
                if (itemParser.isBigInteger()){
                    return new BigIntAddAndSubExpressionParser(itemParser);
                }
                return new SimpleIntAddAndSubExpressionParser(itemParser);
            case INT_A_S_B:
                if (itemParser.isBigInteger()){
                    return new BigIntAddAndSubBracketExpressionParser(itemParser);
                }
                return new SimpleIntAddAndSubBracketExpressionParser(itemParser);
            case INT_M_D:
                if (itemParser.isBigInteger()){
                    return new BigIntMAndDExpressionParser(itemParser);
                }
                return new SimpleIntMAndDExpressionParser(itemParser);
            case INT_A_S_M_D:
                if (itemParser.isBigInteger()){
                    return new BigIntFFOExpressionParser(itemParser);
                }
                return new SimpleIntFFOExpressionParser(itemParser);
            case INT_M_D_B:
            case INT_ALL:
                if (itemParser.isBigInteger()){
                    return new BigIntAllExpressionParser(itemParser);
                }
                return new SimpleIntAllExpressionParser(itemParser);
            case DECIMAL_ALL:
            case DECIMAL_M_D_B:
            case DECIMAL_A_S_B:
            case DECIMAL_M_D:
            case DECIMAL_A_S:
            case DECIMAL_A_S_M_D:
                if (itemParser.isBigInteger()){
                    return new BigDecimalAllExpressionParser(itemParser);
                }
                return new SimpleDecimalAllExpressionParser(itemParser);
        }
        return null;
    }

    /**
     * 获取数学表达式的解析器
     * @param expression 数学表达式字符串
     * @return 返回解析器
     * @throws NullPointerException 假如参数为null或空，则抛出该异常
     */
    public static IExpressionParser getExpressionParser(String expression){
        return getExpressionParser(new ExpressionItemParser(expression));
    }

    /**
     * 获取数学表达式的解析器
     * @param expression 数学表达式字符串
     * @param checker
     * @return 返回解析器
     * @throws NullPointerException 假如第一个参数为null或空，则抛出该异常
     */
    public static IExpressionParser getExpressionParser(String expression,
                                                        BigIntegerChecker checker){
        return getExpressionParser(new ExpressionItemParser(expression, checker));
    }
}
